home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / asm / alib11b.zip / CODE1.ZIP / DEBUG / PRO.ASM < prev    next >
Assembly Source File  |  1994-10-03  |  8KB  |  352 lines

  1.     page    70,132
  2. code_seg    segment
  3.     assume    cs:code_seg,ds:code_seg
  4. ;------------------------------------------------------------------------
  5. ; abstract
  6. ;
  7. ; PRO will watch 4 areas of memory for activity.  The areas must have the
  8. ; same execution segent, and be contigious.  Results will be displayed
  9. ; on moncrome monitor at top while programs execute.  PRO must be
  10. ; loaded last to catch the execution segment at timer interrupt time.
  11. ;
  12. ; The variable DISPLAY_SEGMENT can be changed to b800 for color displays.
  13. ; The WATCH_SEGMENT can be changed to view a different segment.
  14. ; The variables WATCH_OFFSETn can be changed to select capture areas.
  15. ;
  16. ; Each WATCH_OFFSET selects the start of a capture area.  The variable
  17. ; WATCH_OFFSETX selects the end for all capture activity.
  18. ;
  19. ;--------------------------------------------------------------------
  20. ;
  21. ; The following makefile can be used to compile PRO.
  22. ;
  23. ;target:    pro.com
  24. ;        
  25. ;pro.COM:    pro.OBJ
  26. ;        tlink /x /v  pro
  27. ;
  28. ;pro.OBJ:    pro.ASM
  29. ;        tasm /zi pro
  30. ;--------------------------------------------------------------------
  31. ; variables and constants
  32. ;
  33.  
  34. watch_segment        dw    0d003h
  35.  
  36. watch_offset1        dw    00000h
  37. hit1_cnt        dd    0        ;counter1
  38. watch_offset2        dw    00950h
  39. hit2_cnt        dd    0        ;counter2
  40. watch_offset3        dw    009a2h
  41. hit3_cnt        dd    0        ;counter3
  42. watch_offset4        dw    00a1dh
  43. hit4_cnt        dd    0        ;counter4
  44. watch_offsetx        dw    01249h        ;final offset
  45.   
  46. DISPLAY_LINE    db    80 dup (' '),0
  47. DISPLAY_ATTRIBUTE    db    70h        ;default = reverse video
  48. DISPLAY_ADDRESS        label    dword
  49.  DISPLAY_OFFSET            dw    0        ;offset of our window
  50.  DISPLAY_SEGMENT    dw    0b800h        ;display segment
  51.  
  52.  
  53. TIMER_DS        dw    0        ;ds save
  54. TIMER_ES        dw    0        ;es save
  55. TIMER_AX        dw    0        ;ax save
  56. TIMER_BX        dw    0        ;bx save
  57. TIMER_CX        dw    0        ;cx save
  58. TIMER_DX        dw    0        ;dx save
  59. TIMER_SI        dw    0        ;di save
  60. TIMER_DI        dw    0        ;di save
  61. TIMER_BP        dw    0        ;bp save
  62.  
  63. SS_SAVE            dw    0        ;ss save (swap modes)
  64. SP_SAVE            dw    0        ;sp save (swap modes)
  65. ;
  66. ; stack structure at timer interrupt time
  67. ;
  68. stk    struc
  69.   exec_off    dw    ?
  70.   exec_seg    dw    ?
  71.   exec_flg    dw    ?
  72. stk    ends
  73.  
  74. ;----------------------------------------------------------------------
  75. ; int 08 handler (timer)
  76. ;
  77. JMP_TBL        DW    BIN1
  78.         DW    BIN2
  79.         DW    BIN3
  80.         DW    BIN4
  81.         DW    SHOW
  82.         DW    RESTART
  83. JMP_TBL_PTR    DW    JMP_TBL
  84.  
  85. our_int08:
  86.     mov    cs:TIMER_DS,ds
  87.     mov    cs:TIMER_AX,ax
  88.     mov    cs:TIMER_ES,es
  89.     mov    ax,cs
  90.     mov    ds,ax
  91.     mov    es,ax
  92.     mov    TIMER_BX,bx
  93.     mov    TIMER_CX,cx
  94.     mov    TIMER_DX,dx
  95.     mov    TIMER_SI,si
  96.     mov    TIMER_DI,di
  97.     mov    TIMER_BP,bp
  98. ;
  99. ; get the current execution point from the stack
  100. ;
  101.     mov    bp,sp
  102.     mov    ax,[bp.exec_seg]
  103.     cmp    ax,watch_segment
  104.     jne    build_display            ;exit if wrong segment
  105.     mov    ax,[bp.exec_off]
  106.     cmp    ax,watch_offset1
  107.     jb    build_display            ;exit if out of range
  108.     cmp    ax,watch_offset2
  109.     jb    hit1                ;jmp if hit found
  110.     cmp    ax,watch_offset3
  111.     jb    hit2
  112.     cmp    ax,watch_offset4
  113.     jb    hit3
  114.     cmp    ax,watch_offsetx
  115.     jb    hit4
  116.     jmp    build_display            ;jmp if out of range
  117.  
  118.  
  119. hit1:    add    word ptr hit1_cnt,1
  120.     jnc    build_display
  121.     inc    word ptr hit1_cnt+2
  122.     jmp    build_display
  123. hit2:    add    word ptr hit2_cnt,1
  124.     jnc    build_display
  125.     inc    word ptr hit2_cnt+2
  126.     jmp    build_display
  127. hit3:    add    word ptr hit3_cnt,1
  128.     jnc    build_display
  129.     inc    word ptr hit3_cnt+2
  130.     jmp    build_display
  131. hit4:    add    word ptr hit4_cnt,1
  132.     jnc    build_display
  133.     inc    word ptr hit4_cnt+2
  134.     jmp    build_display
  135.  
  136. build_display:
  137.     mov    bx,JMP_TBL_PTR
  138.     mov    ax,word ptr [bx]        ;get next entry
  139.     add    bx,2                ;update
  140.     mov    JMP_TBL_PTR,bx            ;  jmp table pointer
  141.     jmp    ax
  142. ;
  143. ; convert one counter to ascii and store in display buffer
  144. ;
  145. bin1:    mov    si,(offset DISPLAY_LINE)+10
  146.     mov    ax,word ptr hit1_cnt
  147.     mov    dx,word ptr hit1_cnt+2
  148.     call    dword_to_decimal_ascii
  149.     jmp    timer_exit
  150. ;
  151. ; convert one counter to ascii and store in display buffer
  152. ;
  153. bin2:    mov    si,(offset DISPLAY_LINE)+30
  154.     mov    ax,word ptr hit2_cnt
  155.     mov    dx,word ptr hit2_cnt+2
  156.     call    dword_to_decimal_ascii
  157.     jmp    timer_exit
  158. ;
  159. ; convert one counter to ascii and store in display buffer
  160. ;
  161. bin3:    mov    si,(offset DISPLAY_LINE)+50
  162.     mov    ax,word ptr hit3_cnt
  163.     mov    dx,word ptr hit3_cnt+2
  164.     call    dword_to_decimal_ascii
  165.     jmp    timer_exit
  166. ;
  167. ; convert one counter to ascii and store in display buffer
  168. ;
  169. bin4:    mov    si,(offset DISPLAY_LINE)+70
  170.     mov    ax,word ptr hit4_cnt
  171.     mov    dx,word ptr hit4_cnt+2
  172.     call    dword_to_decimal_ascii
  173.     jmp    timer_exit
  174.     
  175. show:
  176.     mov    si,offset DISPLAY_LINE
  177.     call    display_string
  178.     jmp    timer_exit
  179.     
  180. restart:cld
  181.     mov    di,offset DISPLAY_LINE
  182.     mov    cx,80
  183.     mov    al,' '
  184.     rep    stosb                ;clear display line
  185.     
  186.     mov    ax,offset jmp_tbl
  187.     mov    jmp_tbl_ptr,ax
  188.     
  189. timer_exit:
  190.     mov    bp,TIMER_BP
  191.     mov    di,TIMER_DI
  192.     mov    si,TIMER_SI
  193.     mov    ax,TIMER_AX
  194.     mov    bx,TIMER_BX
  195.     mov    cx,TIMER_CX
  196.     mov    dx,TIMER_DX
  197.     mov    es,TIMER_ES
  198.     mov    ds,TIMER_DS
  199.     db    0eah            ;jump far
  200. bios_int08_offset    dw    0
  201. bios_int08_segment    dw    0
  202. ;------------------------------------------------------------------------------
  203. ; subroutine to display a string terminated with a zero
  204. ;  inputs ds:si point at string
  205. ;        DISPLAY_ATTRIBUTE db 70h ;default = reverse video
  206. ;        DISPLAY_ADDRESS DD 0
  207. ;          DISPLAY_OFFSET    dw 0 ;offset of our window
  208. ;          DISPLAY_SEGMENT dw 0  ;display segment
  209. ;  outputs ds:si point at end of string
  210. ;
  211. display_string:
  212.     cld
  213.     les    di,DISPLAY_ADDRESS
  214.     mov    ah,DISPLAY_ATTRIBUTE
  215. mono_string_loop:
  216.     lodsb                     ;get next char.
  217.     or    al,al            ;check for zero
  218.     jz    mono_text_exit        ;jump if end found
  219.     stosw                    ;move one char. to display
  220.     jmp    short mono_string_loop    ;jump if end not found yet
  221. mono_text_exit:
  222.     ret
  223. ;------------------------------------------------------------------------
  224. ; convert binary to decimal-ascii
  225. ;  inputs AX = binary
  226. ;         DS:SI = end of string area padded with blanks
  227. ;
  228. binary_to_ascii:
  229.     mov    bx,10
  230. bin_to_asc_loop:
  231.     cmp    ax,10
  232.     jb    last_digit        ;jump if done
  233.     xor    dx,dx            ;clear dx
  234.     div    bx            ;divide number by 10
  235.     or    dl,30h            ;convert remainder to ascii
  236.     mov    [si],dl            ;store ascii char.
  237.     dec    si            ;move towards front of string
  238.     jmp    short bin_to_asc_loop    ;loop till done
  239. last_digit:
  240.     or    al,30h            ;form last ascii char.
  241.     mov    [si],al            ;store last ascii char.
  242.     ret
  243. ;----------------------------------------
  244. ; binary dword to decimal ascii
  245. ;   inputs dx,ax = binary
  246. ;   ds:si points to end of stuff area
  247. ;
  248.     public    dword_to_decimal_ascii
  249. dword_to_decimal_ascii proc  near
  250.     xchg    bp,dx
  251.     mov    bx,10
  252.     mov    cl,30h
  253. aajj:    xchg    ax,bp
  254.     sub    dx,dx
  255.     div    bx
  256.     xchg    bp,ax
  257.     div    bx
  258.     or    dl,cl
  259.     mov    [si],dl
  260.     dec    si
  261.     cmp    ax,0
  262.     jnz    aajj
  263.     ret
  264. dword_to_decimal_ascii    endp
  265. ;-----------------------------------------------------------------------
  266. ; subroutine to convert byte to hex ascii
  267. ;  inputs   AL  = hex
  268. ;         DS:SI = storage point
  269. ;
  270. byte_to_hex_ascii:
  271.     mov    ah,al            ;save data for later
  272.     and    al,0fh            ;isolate low nibble
  273.     add    al,'0'
  274.     cmp    al,'9'
  275.     jle    next_nibble        ;jump if conversion ok
  276.     add    al,'A'-'9'-1
  277. next_nibble:
  278.     xchg    ah,al
  279.     shr    al,1            ;right
  280.     shr    al,1            ;  justify
  281.     shr    al,1            ;     high
  282.     shr    al,1            ;        nibble
  283.     add    al,'0'
  284.     cmp    al,'9'
  285.     jle    hex_store        ;jump if conversion ok
  286.     add    al,'A'-'9'-1
  287. hex_store:
  288.     mov    [si],ax
  289.     add    si,2
  290.     ret
  291. ;---------------------------------------------------------------------------
  292. ; subroutine to convert word to hex ascii
  293. ;  inputs   BX  = hex word
  294. ;         DS:SI = store pointer
  295. ;
  296. word_to_hex_ascii:
  297.     mov    al,bh            ;get high byte
  298.     call    byte_to_hex_ascii    ;convert and store one byte
  299.     mov    al,bl            ;get low byte
  300.     call    byte_to_hex_ascii    ;convert and store one byte
  301.     ret
  302. ;---------------------------------------------------------------------
  303. ; initialization
  304. ;
  305.     assume    cs:code_seg,ds:code_seg
  306.     
  307. start:
  308. ; display sign on 
  309. display_msg: 
  310.     mov    ax,cs
  311.     mov    ds,ax
  312.     mov    es,ax
  313.     
  314.     mov    ah,9 
  315.     mov    dx,offset SIGN_ON 
  316.     int    21h 
  317. ;
  318. ; grab int08 vector (timer)
  319. ;
  320.     sub    ax,ax
  321.     mov    es,ax
  322.     mov    bx,20h            ;offset of int08
  323.     mov    ax,es:[bx]        ;get bios offset
  324.     mov    bios_int08_offset,ax    ;  and save
  325.     mov    ax,es:[bx+2]        ;get bios segment        
  326.     mov    bios_int08_segment,ax    ;  and save
  327.     cli
  328.     mov    word ptr es:[bx],offset our_int08 ;take over the
  329.     mov    es:[bx+2],cs         ;  vector
  330.     sti
  331.  
  332. ;
  333. ; exit but stay resident
  334. ;
  335.     mov    dx,offset start        ;compute pargraphs needed
  336.     mov    cl,4
  337.     shr    dx,cl
  338.     add    dx,17            ;add in PSP header size + extra
  339.     mov    ax,3100h
  340.     int    21h
  341.     
  342. sign_on    db    0dh,0ah,'PRO ' 
  343.  
  344.     db    ' (Ver 1.03) installed - Written by Jeff Owens ' 
  345.     db    0dh,0ah,'$'
  346.  
  347.  
  348. code_seg    ends
  349.         end    start
  350.